package com.lzk.service;

import com.lzk.caches.RedisUtil;
import com.lzk.dao.TransactionOrderDao;
import com.lzk.dao.WXPayTransactionLonDao;
import com.lzk.pojo.TransactionOrder;
import com.lzk.pojo.WXPayTransactionLog;
import com.lzk.utils.IdWorker;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * Created by Linzk on 2020/12
 */
@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private TransactionOrderDao transactionOrderDao;
    @Autowired
    private WXPayTransactionLonDao wxPayTransactionLonDao;
    @Autowired
    private RedisUtil redisUtil;


    @Override
    public void addOrder(TransactionOrder transactionOrder) {
        //插入交易订单
        TransactionOrder toData = new TransactionOrder();
        BeanUtils.copyProperties(transactionOrder, toData);
        transactionOrderDao.save(toData);
        /**
         * 1. 增加支付日志
         * 1.1 订单的支付类型为"微信支付"就添加一条微信的支付日志
         * 1.2  --->"1"代表微信支付
         */

        if ("1".equals(transactionOrder.getPaymentType())){
            //如果是微信支付的情况下
            WXPayTransactionLog wxLog = new WXPayTransactionLog();
            //支付订单号
            wxLog.setOutTradeNo(new IdWorker().nextId() + "");
            //totalFee微信支付金额的单位：分
            wxLog.setTotalFee((long) (transactionOrder.getOrderMoney() * 100));
            wxLog.setTradeStatus("0");
            //这里的支付的用户ID，暂时设置为1表示超管
            wxLog.setUserId("1");
            //支付类型：1表示微信支付
            wxLog.setPayType("1");
            wxLog.setCreateTime(new Date());
            wxLog.setUpdateTime(new Date());

            wxPayTransactionLonDao.save(wxLog);
            //微信支付交易日志存储Redis缓存,根据用户id存储
            redisUtil.set(wxLog.getUserId(), wxLog);
        }
    }

    /**
     * 读取存储到Redis中的微信支付日志
     * @param userId
     * @return
     */
    @Override
    public WXPayTransactionLog searchPayLogFromRedis(String userId) {
        WXPayTransactionLog wxPayTransactionLog = (WXPayTransactionLog)redisUtil.get(userId);
        return wxPayTransactionLog;
    }

    /**
     * 1. 用户支付成功修改订单状态接口
     * @param out_trade_No
     * @param transaction_id
     */
    @Override
    public void updateOrderStatus(String out_trade_No, String transaction_id) {
        //1.修改微信支付记录表的状态及相关字段（根据商户订单号修改）
        WXPayTransactionLog wxPayTransactionLog = wxPayTransactionLonDao.findByOutTradeNo(out_trade_No);
        wxPayTransactionLog.setPayTime(new Date()); //支付时间
        wxPayTransactionLog.setTradeStatus("1"); //微信交易状态 = 已支付(1)
        wxPayTransactionLog.setTransactionId(transaction_id); //支付成功，微信返回的交易流水号
        wxPayTransactionLonDao.save(wxPayTransactionLog);
        //2. 修改订单表的状态（根据）
        String orderList = wxPayTransactionLog.getOrderList();
        //2.1 将使用"，"隔开的交易单id，提取出来，存储String数组里面(这里存的是交易单的主键ID)
        String[] orderIds = orderList.split(",");
        //2.2 for循环
        for (String orderId : orderIds) {
            TransactionOrder transactionOrder = transactionOrderDao.getById(Long.valueOf(orderId));
            //--->值为"2":表示已付款状态
            transactionOrder.setStatus("2");
            //--->用户订单支付成功后，传入支付时间
            transactionOrder.setPayTime(new Date());
            transactionOrderDao.save(transactionOrder);
        }


        //3. 清楚缓存中的具体(微信)订单的支付记录(支付成功了，这些缓存就没用了)
        //3.1 Redis存进去的是以UserId为键存的，删除时候根据微信支付记录表中的UserId来删除
        redisUtil.del(wxPayTransactionLog.getUserId());
    }
}
